//Cópia do código: http://ideone.com/4nrX13
//Operações bitwise: http://ideone.com/0DKN5W
//Valor de cada funcao: //http://ideone.com/B45stI
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CARACTERES(N) (N > 64 && N < 91)||(N > 96 && N < 123)
#define NUMEROS(N) (N > 47 && N < 58)
#define ESPECIAIS(N) (N == 36 || N == 35 || N == 40 || N == 41) // "$, #, (, )"
#define Q_LINHA(N) (N == -1 || N == 10 || N == 13) // EOF, \n , \r
#define ESPACO(N) (N == 44 || N == 9 || N == 32) // ',', '\t', ' '
#define COND_LINHA_VALIDA(N) (CARACTERES(N)||NUMEROS(N)||ESPECIAIS(N))

void PrintBinario(long num, short len){
    short i;
    
    for (i = len-1; i >= 0; --i){
        printf("%d", ((num & (1 << i)) != 0));
    }
}

short RegistradorInd(char reg[10]){
    char *p;
    short n;
    
    //if ((p = strchr(reg, 't')) != NULL)   printf("%d\n", (short)(p - reg));
    
    if ((p = strchr(reg, '$'))!= NULL){
        n = p - reg;
        if (reg[n+1] == 's') return (16 + (short)(reg[n+2] - '0'));
        else if (reg[n+1] == 't') return (8 + (short)(reg[n+2] - '0'));
        else return 0;

    } //else return (reg[1] - '0');
}

short RegistradorBase(char reg[10]){
    char num[7];
    short i;

    //printf("((%s))", reg);

    for (i = 0; reg[i] != '('; ++i)
        num[i] = reg[i];

    num[i] = '\0';

    //printf("%s\n", num);

    return (short) atoi(num);
}

long TipoR(char coman[3][10], short inst){
    long codigo = 0;
    short i;
    
    codigo |= (RegistradorInd(coman[0]) << 11);//destino
    codigo |= (RegistradorInd(coman[1]) << 21);//font1
    codigo |= (RegistradorInd(coman[2]) << 16);//font2
    
    //Falta implementar srl, sll, jr

    if (inst == 220){
        codigo |= (RegistradorInd(coman[0]) << 21);//font1
        codigo |= 8;
    }

    switch(inst){
        case 297: //add
            codigo |= 32;
            break;
        case 330: //sub
            codigo |= 34;
            break;
        case 307: //and:
            codigo |= 36;
            break;
        case 225: //or
            codigo |= 37;
            break;
        case 339: //slt
            codigo |= 42;
            break;
    }
    
    for (i = 0; i < 3; ++i)
        printf("%s|", coman[i]);
        
    return codigo;
}

void TipoJ(char coman[3][10], short inst){
    long codigo = 0;
    short i;
 
    
    printf("%s|", coman[0]);

}

long TipoI(char coman[3][10], short inst){
    long codigo = 0;
    short i;
    //Não funciona para labels
    codigo |= (RegistradorInd(coman[1]) << 21); //registrador
    codigo |= (RegistradorInd(coman[0]) << 16); //principal
    codigo |= (RegistradorBase(coman[1])); //base
    
    switch(inst){
        case 227: //lw
            codigo |= 35 << 26;
            break;
        case 234: //sw
            codigo |= 43 << 26;
            break;
        case 402: //addi
            codigo |= 8 << 26;
            break;
        case 309: //bne
            codigo |= 5 << 26;
            break;
        case 312: //beq
            codigo |= 4 << 26;
            break;
    }

    for (i = 0; i < 2; ++i)
        printf("%s|", coman[i]);
        
    return codigo;
}

void Identifica(char linha[50]){
    
    short inst = 0, i = 0, j = 0, k;
    char coman[3][10];

    while (linha[i] != ' ') inst += (short) linha[i++];

    while(linha[i] != '\0'){
        ++i; //pula espaço
        for (k = 0; linha[i] != ' ' && linha[i] != '\0'; ++i, ++k) coman[j][k] = linha[i];
        coman[j++][k] = '\0';
    }
    
    switch(inst){
        case 297: case 330: case 307: case 225: case 331: case 337: case 339: case 220:
            printf("Tipo R|"); PrintBinario(TipoR(coman, inst), 32); printf("\n");
            break;
        case 106: case 311:
            printf("Tipo J|");TipoJ(coman, inst);printf("\n");
            break;
        case 227: case 234: case 402: case 309: case 312:
            printf("Tipo I|"); PrintBinario(TipoI(coman, inst), 32); printf("\n");
            break;
    }
}


int main(void) {
 
    char ch, linha[50];
    short cont;

    while ((ch =  getchar()) != EOF){

        for (cont = 0; !Q_LINHA(ch); ){
            if (COND_LINHA_VALIDA(ch)){
                linha[cont++] = ch;
                ch = getchar();
                
            } else {
                if (cont > 0) linha[cont++] = ' ';
                for (ch = getchar(); ESPACO(ch); ch = getchar());
            }
        }

        if (cont > 0){
            if (ESPACO(linha[cont-1])) --cont;
            linha[cont] = '\0';
            Identifica(linha);
        }
    }

    return 0;
}
